import jwt from 'jsonwebtoken';
import { Session } from '../models/Session.js';
import { User } from '../models/User.js';
import { log } from '../utils/logger.js';
import { getClientIP } from '../utils/ipHelper.js';

const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';

/**
 * JWT认证中间件
 */
export async function authenticate(req, res, next) {
  try {
    // 从请求头获取token
    const authHeader = req.headers.authorization;
    
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      log.auth('认证失败：缺少token', { ip: getClientIP(req) });
      return res.status(401).json({ 
        success: false, 
        message: '未授权访问，请先登录' 
      });
    }

    const token = authHeader.substring(7);

    // 验证JWT
    let decoded;
    try {
      decoded = jwt.verify(token, JWT_SECRET);
    } catch (error) {
      log.auth('认证失败：token无效', { ip: getClientIP(req) });
      return res.status(401).json({ 
        success: false, 
        message: 'Token无效或已过期' 
      });
    }

    // 检查会话是否有效（实现单用户在线限制）
    const session = await Session.findByToken(token);
    
    if (!session) {
      log.auth('认证失败：会话不存在或已失效', { 
        userId: decoded.userId,
        ip: getClientIP(req) 
      });
      return res.status(401).json({ 
        success: false, 
        message: '会话已失效，请重新登录' 
      });
    }

    // 获取用户信息
    const user = await User.findById(decoded.userId);
    
    if (!user) {
      log.auth('认证失败：用户不存在', { userId: decoded.userId });
      return res.status(401).json({ 
        success: false, 
        message: '用户不存在' 
      });
    }

    // 更新会话过期时间（滑动过期）
    const sessionTimeout = parseInt(process.env.SESSION_TIMEOUT || '30');
    const newExpiresAt = new Date(Date.now() + sessionTimeout * 60 * 1000);
    await Session.updateLastActivity(token, newExpiresAt);

    // 将用户信息附加到请求对象
    req.user = {
      id: user.id,
      username: user.username,
      email: user.email
    };
    req.token = token;
    req.clientIP = getClientIP(req);

    next();
  } catch (error) {
    log.error('认证中间件错误', { error: error.message });
    res.status(500).json({ 
      success: false, 
      message: '服务器错误' 
    });
  }
}

/**
 * 生成JWT token
 */
export function generateToken(userId) {
  const sessionTimeout = parseInt(process.env.SESSION_TIMEOUT || '30');
  
  return jwt.sign(
    { userId },
    JWT_SECRET,
    { expiresIn: `${sessionTimeout}m` }
  );
}

/**
 * 可选认证中间件（token存在则验证，不存在则跳过）
 */
export async function optionalAuthenticate(req, res, next) {
  const authHeader = req.headers.authorization;
  
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return next();
  }

  // 如果有token，则验证
  return authenticate(req, res, next);
}

